﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Systemet.Views
{
    public partial class Direktkostnadsbudgetering : UserControl
    {
        private Domain.KostnadsBudgController kBC;
        private List<Produkt> products;
        private List<Kontoregister> accounts;
        private IEnumerable<Aktivietetsregister> activities;

        private List<AktivitetsKostnad> activityCosts;
        private List<ProduktKostnad> productCosts;
        private DataTable dT;
        private DataTable sumDT;
        string currentCell;
        bool cellChanging = false;
        bool isRemove = true;
        private string currentDepartment;
        public Direktkostnadsbudgetering()
        {
            InitializeComponent();
            AccessController.Instance.MainView = this;
            kBC = new Domain.KostnadsBudgController();
        }
        //Clearar
        public void clearDGV()
        {

            if (this.dGVDirektKostnads.DataSource != null)
            {
                this.dGVDirektKostnads.DataSource = null;
                this.dgvSUM.DataSource = null;
            }
            else
            {
                this.dGVDirektKostnads.Rows.Clear();
                this.dgvSUM.Rows.Clear();
            }


        }


        public void RetrieveProductsNAccounts(List<Produkt> prodList, List<Kontoregister> accs, List<ProduktKostnad> prodcostlist, List<AktivitetsKostnad> activitCostList, string prodOmr)
        {
            currentDepartment = prodOmr;
            products = prodList;
            accounts = accs;
            activityCosts = activitCostList;
            productCosts = prodcostlist;
            CreateDataTableDriftUtv();
        }

        public void RetrieveActivitiesNAccounts(IEnumerable<Aktivietetsregister> activ, List<Kontoregister> accs, List<AktivitetsKostnad> activitCostList, List<ProduktKostnad> prodcostlist, string prodOmr)
        {
            currentDepartment = prodOmr;
            activities = activ;
            accounts = accs;
            productCosts = prodcostlist;
            activityCosts = activitCostList;
            CreateDataTableAdmMark();
        }
        //Table för drift
        private void CreateDataTableDriftUtv()
        {
            dT = new DataTable();
            dT.Columns.Add(new DataColumn("Kontonummer", typeof(string)));
            dT.Columns.Add(new DataColumn("Kontobenämning", typeof(string)));
            dT.Columns.Add(new DataColumn("Total belopp", typeof(string)));
            sumDT = new DataTable();
            dgvSUM.DataSource = sumDT;
            sumDT.Columns.Add(new DataColumn("Kontonummer", typeof(string)));
            sumDT.Columns.Add(new DataColumn("Kontobenämning", typeof(string)));
            sumDT.Columns.Add(new DataColumn("Total belopp", typeof(string)));
            int totalbelopp;
            foreach (Kontoregister k in accounts)
            {
                totalbelopp = 0;
                foreach (AktivitetsKostnad aK in activityCosts)
                {
                    if (aK.Kontonummer == k.kontonummer)
                    {
                        totalbelopp = totalbelopp + (int)aK.Belopp;
                    }
                }
                foreach (ProduktKostnad pK in productCosts)
                {
                    if (pK.Kontonummer == k.kontonummer)
                    {
                        totalbelopp = totalbelopp + (int)pK.Belopp;
                    }

                }
                dT.Rows.Add(k.kontonummer.ToString(), k.kontobenämning.ToString(), totalbelopp.ToString());

            }
            Dictionary<string, int> Summeringar = new Dictionary<string, int>();
            foreach (Produkt p in products)
            {
                dT.Columns.Add(new DataColumn(p.ProduktNamn.ToString(), typeof(string)));
                sumDT.Columns.Add(new DataColumn(p.ProduktNamn, typeof(string)));
                Summeringar.Add(p.ProduktNamn, 0);
            }
            AllocationSortmentProducts(dT, productCosts, Summeringar);
            AddDataToDgv(dT, Summeringar, sumDT);
        }

        public void AllocationSortmentProducts(DataTable dt, List<ProduktKostnad> allo, Dictionary<string, int> sum)
        {
            string colName = "";
            foreach (DataRow dR in dT.Rows)
            {
                foreach (DataColumn dC in dt.Columns)
                {
                    foreach (Kontoregister k in accounts)
                    {
                        if (dR[dC].ToString() == k.kontonummer)
                        {
                            foreach (ProduktKostnad pK in allo)
                            {
                                if (k.kontonummer == pK.Kontonummer)
                                {
                                    foreach (Produkt p in products)
                                    {
                                        if (p.ProduktID == pK.ProduktID)
                                        {
                                            colName = p.ProduktNamn;
                                            dR[colName] = (int)pK.Belopp;

                                            if (dR.Table.Columns[colName] != null)
                                            {

                                                if (pK.Belopp != null)
                                                {
                                                    sum[colName] += (int)pK.Belopp;
                                                }
                                            }
                                        }

                                    }
                                }
                            }
                        }
                    }
                }

            }


        }



        private void CreateDataTableAdmMark()
        {
            dT = new DataTable();
            dT.Columns.Add(new DataColumn("Kontonummer", typeof(string)));
            dT.Columns.Add(new DataColumn("Kontobenämning", typeof(string)));
            dT.Columns.Add(new DataColumn("Total belopp", typeof(string)));
            DataTable SumDT = new DataTable();
            dgvSUM.DataSource = SumDT;
            SumDT.Columns.Add(new DataColumn("Kontonummer", typeof(string)));
            SumDT.Columns.Add(new DataColumn("Kontobenämning", typeof(string)));
            SumDT.Columns.Add(new DataColumn("Total belopp", typeof(string)));
            int totalbelopp;
            foreach (Kontoregister k in accounts)
            {
                totalbelopp = 0;
                foreach (AktivitetsKostnad aK in activityCosts)
                {
                    if (aK.Kontonummer == k.kontonummer)
                    {
                        totalbelopp = totalbelopp + (int)aK.Belopp;
                    }
                }
                foreach (ProduktKostnad pK in productCosts)
                {
                    if (pK.Kontonummer == k.kontonummer)
                    {
                        totalbelopp = totalbelopp + (int)pK.Belopp;
                    }

                }
                dT.Rows.Add(k.kontonummer.ToString(), k.kontobenämning.ToString(), totalbelopp.ToString());

            }
            Dictionary<string, int> Summeringar = new Dictionary<string, int>();
            foreach (Aktivietetsregister a in activities)
            {
                dT.Columns.Add(new DataColumn(a.aktivitet, typeof(string)));
                SumDT.Columns.Add(new DataColumn(a.aktivitet, typeof(string)));
                Summeringar.Add(a.aktivitet, 0);
            }

            AllocationSortmentActivities(dT, activityCosts, Summeringar);
            AddDataToDgv(dT, Summeringar, SumDT);
        }

        public void AllocationSortmentActivities(DataTable dt, List<AktivitetsKostnad> allo, Dictionary<string, int> sum)
        {

            string colName = "";
            foreach (DataRow dR in dT.Rows)
            {
                foreach (DataColumn dC in dt.Columns)
                {
                    foreach (Kontoregister k in accounts)
                    {
                        if (dR[dC].ToString() == k.kontonummer)
                        {
                            foreach (AktivitetsKostnad aK in allo)
                            {
                                if (k.kontonummer == aK.Kontonummer)
                                {
                                    foreach (Aktivietetsregister a in activities)
                                    {
                                        if (a.aktivitetsID == aK.AktivitetsID)
                                        {
                                            colName = a.aktivitet;

                                        }
                                    }
                                    if (dR.Table.Columns[colName] != null)
                                    {
                                        dR[colName] = aK.Belopp;
                                        if (aK.Belopp != null)
                                        {
                                            sum[colName] += (int)aK.Belopp;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

            }


        }
        //Data till GV
        private void AddDataToDgv(DataTable dt, Dictionary<string, int> sum, DataTable sumDt)
        {
            dGVDirektKostnads.DataSource = dt;
            dGVDirektKostnads.Columns[0].Frozen = true;
            dGVDirektKostnads.Columns[1].Frozen = true;
            dGVDirektKostnads.Columns[2].Frozen = true;
            dGVDirektKostnads.Columns[0].ReadOnly = true;
            dGVDirektKostnads.Columns[1].ReadOnly = true;
            dGVDirektKostnads.Columns[2].ReadOnly = true;

            DataRow dr = sumDt.NewRow();

            foreach (KeyValuePair<string, int> key in sum)
            {
                string k = key.Key;
                int val = key.Value;

                dr[k] = val.ToString();
            }
            int totalsumma = 0;
            for (int i = 0; i < dGVDirektKostnads.Rows.Count - 1; i++)
            {

                totalsumma += int.Parse(dGVDirektKostnads.Rows[i].Cells[2].Value.ToString());
            }
            sumDt.Rows.Add(dr);
            dgvSUM.DataSource = sumDt;
            dgvSUM.Columns[0].Width = dGVDirektKostnads.Columns[0].Width + dGVDirektKostnads.Columns[1].Width;
            dgvSUM.Rows[0].Cells[1].Value = totalsumma.ToString();
            dgvSUM.Rows[0].Cells[0].Value = "Total";
            dgvSUM.Columns[0].Frozen = true;
            dgvSUM.Columns[1].Frozen = true;
            dgvSUM.Columns[2].Visible = false;
            dgvSUM.Refresh();
            dgvSUM.ClearSelection();
            dgvSUM.CurrentCell = null;
        }

        private void dGVDirektKostnads_Scroll(object sender, ScrollEventArgs e)
        {
            if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)
            {

                dgvSUM.HorizontalScrollingOffset = dGVDirektKostnads.HorizontalScrollingOffset;
            }

        }
        //När man ändrar ett värde i dgv
        private void dGVDirektKostnads_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (cellChanging)
            {
                cellChanging = false;

                bool IsNewAllocation = false;

                string nyAllokering = dGVDirektKostnads.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                string columnName = dGVDirektKostnads.Columns[e.ColumnIndex].Name.ToString();
                string kontoNummer = dGVDirektKostnads.Rows[e.RowIndex].Cells[0].Value.ToString();
                int row = e.RowIndex;
                int kolumn = e.ColumnIndex;

                if (nyAllokering == "" && currentCell != "")
                {
                    if (MessageBox.Show("Vill du verkligen ta bort allokeringen " + currentCell + " för " + columnName, "Ta bort allokering?", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                    {

                        kBC = new Domain.KostnadsBudgController();
                        bool isSuccess = kBC.RemoveDirectCost(kontoNummer, columnName, currentDepartment);
                        if (isSuccess)
                        {
                            currentCell = "";
                        }
                        else
                        {
                            MessageBox.Show("Borttagning misslyckades");
                            dGVDirektKostnads.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = currentCell;
                        }
                    }
                    else
                    {
                        //Vill ej ta bort rad

                        dGVDirektKostnads.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = currentCell;

                    }
                }
                if (nyAllokering != "")
                {
                    //validering för att säkerställa att det är en siffra
                    int number;
                    if (!int.TryParse(nyAllokering, out number) && nyAllokering != "")
                    {
                        dGVDirektKostnads.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = currentCell;
                    }
                    //Förändring av värde / Nytt värde
                    else if (currentCell != nyAllokering)
                    {
                        //Checkar efter om det är en Ny allokering eller en förändring
                        if (currentCell == "" || currentCell == "0")
                        {
                            IsNewAllocation = true;
                        }
                        else
                        {
                            IsNewAllocation = false;
                        }

                        //Inmatning av ny Allokering
                        bool isSuccessfull = kBC.InsertOrUpdateDirectCost(kontoNummer, nyAllokering, currentCell, columnName, currentDepartment, IsNewAllocation);
                        if (!isSuccessfull)
                        {
                            MessageBox.Show("Inmatningen misslyckades");
                            dGVDirektKostnads.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = currentCell;
                        }
                    }
                }
            }
        }
        //Hämta värdet av cellen som man arbetar i för återskapande
        private void dGVDirektKostnads_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            currentCell = dGVDirektKostnads.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
            cellChanging = true;

        }


    }
}
